home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / perl5 / Glib / devel.pod < prev    next >
Text File  |  2008-10-22  |  15KB  |  343 lines

  1.  
  2. =head1 NAME
  3.  
  4. Glib::devel - Binding developer's overview of Glib's internals
  5.  
  6. =head1 DESCRIPTION
  7.  
  8. Do you need to know how the gtk2-perl language bindings work, or need to write
  9. your own language bindings for a Glib/Gtk2-based library?  Then you've come to
  10. the right place.  If you are just a perl developer wanting to write programs
  11. with Glib or Gtk2, then this is probably way over your head.
  12.  
  13. This document began its life as a post to gtk-perl-list about a redesign of the
  14. fundamentals of the bindings; today it is the reference documentation for the
  15. developers of the bindings.
  16.  
  17. To reduce confusion, refer to GLib, the C library, with a capital L, and Glib
  18. the perl module with a lower-case l.  While the Gtk2 module is the primary
  19. client of Glib, it is not necessarily the only one; in fact, the perl bindings
  20. for the GStreamer library build directly atop Glib.  Therefore, this document
  21. describes just the GLib/Glib basics.  For details on how Gtk2 extends
  22. upon the concepts presented here, see L<Gtk2::devel>.
  23.  
  24. In various places, we use the name GPerl to refer to the actual binding
  25. subsystem.
  26.  
  27. In order to avoid getting very quickly out of date, this document doesn't go
  28. into great detail on APIs.  gperl.h is rather heavily commented, and should be
  29. considered the canonical source of correct API information.
  30.  
  31. =head1 Basic Philosophy
  32.  
  33. GLib is a portability library for C programs, providing a common set of APIs
  34. and services on various platforms.  Along with that you get libgobject, which
  35. provides an inheritance-based type system and other spiffy things.
  36.  
  37. Glib, as a perl module, must decide which portions of GLib's facilities to map
  38. to perl and which to abstract and encapsulate.
  39.  
  40. In the grand scheme, the bindings have been designed with a few basic tenets in
  41. mind:
  42.  
  43. =over
  44.  
  45. =item -
  46.  
  47. Stick close to the C API, to allow a perl developer to use knowledge from the C
  48. API and API reference docs with the perl bindings; this is overruled in some
  49. places by the remaining tenets.
  50.  
  51. =item -
  52.  
  53. Be perlish.  This is the most important.  The user of the perl bindings should
  54. not have to worry about memory management, reference counting, freeing objects,
  55. and all that stuff, else he might as well go write in C instead.
  56.  
  57. =item -
  58.  
  59. Leave out deprecated functionality.
  60.  
  61. =item -
  62.  
  63. Don't add new functionality.  The exceptions to this rule are consolidation of
  64. methods where default parameters may be used, or where the direct analog from C
  65. is not practical.
  66.  
  67. =item -
  68.  
  69. Be lightweight.  As little indirection and bloat as possible.  If possible,
  70. implement each toplevel module (e.g., Glib, Gtk2, Gnome2, GtkHTML, etc) as one
  71. .pm and one .so.
  72.  
  73. =item -
  74.  
  75. Be extensible.  Export header files and typemaps so that other modules can
  76. easily chain off of our base.  Do not require the entirely of Gtk2 for someone
  77. who needs only to build atop GObject.
  78.  
  79. =back
  80.  
  81. =head1 The Glib Module 
  82.  
  83. In keeping with the tenet of not requiring the entire car for someone who only
  84. needs a single wheel, I broke the glib/gobject library family into its own
  85. module and namespace.  This has proved to be a godsend, as it has made things
  86. very easy to debug; there's a clean separation between the base of the type
  87. system and the stuff on top of it.
  88.  
  89. The Glib module takes care of all the basic types handled by the GObject
  90. library --- GEnum, GFlags, GBoxed, GObject, GValue, GClosure --- as well has
  91. signal marshalling and such in GSignal.  I'll discuss each of these separately.
  92.  
  93. In practice, you will rarely see direct calls to the functions that convert
  94. objects in and out of perl.  Most code should use the C preprocessor to provide
  95. easier-to-remember names that follow the perl API style, e.g.,
  96. newSVGObject(obj) rather than gperl_new_object(type,obj) and SvGObject(sv)
  97. instead of gperl_get_gobject(type, sv).  The convention used in all of
  98. gtk2-perl is described in L<Gtk2::devel>.
  99.  
  100. =head2 Wrappers
  101.  
  102. FIXME maybe this section should be rolled into the GBoxed and GObject sections?
  103.  
  104. In order to use the C data structures from Perl, we need to wrap those objects
  105. up in Perl objects.  In general, a Perl object is simply a blessed reference.
  106. A typical scheme for representing C objects in perl is bless a reference to a
  107. scalar holding the C pointer value; perl will destroy the reference-counted
  108. scalar when there are no more references to it, and one would normally destroy
  109. the underlying data structure at this point.  However, GLib is a little more
  110. complex than your typical C library, so this easy, typical setup won't work for
  111. us.
  112.  
  113. GBoxed types are opaque wrappers for C structures, providing copy and free
  114. functions, to allow the types to be used generically.  For the most part we can
  115. get away with using the typical scheme described above to provide an opaque
  116. object, but in some instances an opaque object is very alien in perl.  The
  117. L<Glib::Boxed> section explains how we get around this.
  118.  
  119. GObject, on the other hand, is a type-aware, reference-counted object with
  120. lifetime semantics that differ somewhat from perl SVs.  Thus we need something
  121. a bit more sophisticated than a plain old opaque wrapper; in fact, we use a
  122. blessed hash reference with the pointer to the C object tucked away in attached
  123. magic, and a pointer to the SV stored in the GObject's user data.  The combined
  124. perl/C object does some nifty reference-count borrowing to ensure that object
  125. lifetime is managed correctly.
  126.  
  127. If an object is created by a function that returns directly to perl, then the
  128. wrapper returned by that function should "own" the object.  If no other code
  129. assumes ownership of that object (by ref'ing a GObject or copying a GBoxed),
  130. then the object should be destroyed when the perl scalar is destroyed
  131. (actually, as part of its destruction).
  132.  
  133. If a function returns a preexisting object owned by someone else, then the
  134. bindings should NOT destroy the object with the perl wrapper.  How we handle
  135. this for the various types is described below.
  136.  
  137. =head2 GType to Package Mappings
  138.  
  139. GType is the GObject library's unique type identifier; this is a runtime
  140. variable, because GLib types may be loaded dynamically.  The direct analog in
  141. perl is the package name, which uniquely specifies an object's class.  Since
  142. these do about the same thing, we completely replace the GType with the perl
  143. package.
  144.  
  145. For various reasons, mostly to do with robustness and performance, there is a
  146. one-to-one mapping between GType classes and perl package names.  These must be
  147. registered, usually as part of the module initialization process.
  148.  
  149. In addition, the type system tries as hard as it can to recover when things
  150. don't go well, using the GType system to its advantage.  If you return a C
  151. object of a type that is not registered with Gperl, such as MyCustomTypeFoo,
  152. gperl_new_object (see below) will warn you that it has blessed the unknown
  153. MyCustomTypeFoo into the first known package in its ancestry, Gtk2::VBox.
  154.  
  155. GBoxed and GObject have distinct mapping registries to avoid cross-pollination
  156. and mistakes in the type system.  See below.
  157.  
  158. To assist in handling inheritance that isn't specified directly by the GType
  159. system, the function gperl_set_isa allows you to add elements to the @ISA for a
  160. package.  gperl_register_object does this for you, but you may need to add
  161. additional parents, e.g., for implementing GInterfaces.  (see
  162. Gtk2/xs/GtkEntry.xs for an example)
  163.  
  164. You may be thinking that we could use substitution rules to map the GObject
  165. classes to perl packages. In practice, this is a bad idea, fraught with
  166. problems; the substitution rules are not easily extendable and are easily
  167. broken by extension packages which don't follow the naming conventions.
  168.  
  169. =head2 GEnums and GFlags
  170.  
  171. GLib provides a mechanism for creating runtime type information about
  172. enumeration and flag types.  Enumerations are lists of specific values, one of
  173. which may be used at at time, whereas multiple flag values may be supplied at a
  174. time.  In C flags are meant to be used with bitfields.  A GType is associated
  175. with the various valid values for a given GEnum or GFlags type as strings, in
  176. both full-name and nickname forms.
  177.  
  178. GPerl uses this mechanism to avoid the need to know integer values for enum and
  179. flag types at the perl level.  An enum value is just a string; a bitfield of
  180. flag values is represented as a reference to an array of strings.  These
  181. strings are the GLib-provided nicknames.  For the convenience of a perl
  182. developer, the bindings treat '-' and '_' as equivalent when looking up the
  183. corresponding integer values during conversion.
  184.  
  185. A GEnum or GFlags type mapping should be registered with
  186.  
  187.  void gperl_register_fundamental (GType gtype, const char * package);
  188.  
  189. so that their package names can be used where a GType is required (for example,
  190. as GObject property types or GtkTreeModel column types).
  191.  
  192. The basic functions for converting between C and perl values are
  193.  
  194.  /* croak if val is not part of type, otherwise return
  195.   * corresponding value.  this is the general case. */
  196.  gint gperl_convert_enum (GType type, SV * val);
  197.  
  198.  /* return a scalar which is the nickname of the enum value
  199.   * val, or croak if val is not a member of the enum. */
  200.  SV * gperl_convert_back_enum (GType type, gint val);
  201.  
  202.  /* collapse a list of strings to an integer with all the
  203.   * correct bits set, croak if anything is invalid. */
  204.  gint gperl_convert_flags (GType type, SV * val);
  205.  
  206.  /* convert a bitfield to a list of strings, or croak. */
  207.  SV * gperl_convert_back_flags (GType type, gint val);
  208.  
  209. Other utility functions allow for finer-grained control, such as the ability to
  210. pass unknown values, which can be necessary in special cases.  In general, each
  211. of these functions raises an exception when something goes wrong.  To be
  212. helpful, they croak with a message listing the valid values when they encounter
  213. invalid input.
  214.  
  215. =head2 GBoxed 
  216.  
  217. GBoxed provides a way to register functions that create, copy, and destroy
  218. opaque structures.  For our purposes, we'll allow any perl package to inherit
  219. from Glib::Boxed and implement accessors for the struct members, but
  220. Glib::Boxed will handle the object and wrapper lifetime issues.
  221.  
  222. There are two functions for creating boxed wrappers:
  223.  
  224.  SV * gperl_new_boxed (gpointer boxed, GType gtype, gboolean own);
  225.  SV * gperl_new_boxed_copy (gpointer boxed, GType gtype);
  226.  
  227. If own is TRUE, the wrapper returned by gperl_new_boxed will take boxed with it
  228. when it dies.  In the case of a copy, own is implied, so there's a separate
  229. function which doesn't need the own option.
  230.  
  231. To get a boxed pointer out of a scalar wrapper, you just call
  232. gperl_get_boxed_check --- this will croak if the sv is undef or not blessed
  233. into the specified package.
  234.  
  235. When you register a boxed type you get the option of supplying a table of
  236. function pointers describing how the boxed object should be wrapped, unwrapped,
  237. and destroyed.  This allows you to decide in the wrapping function what
  238. subclass of the boxed type's class the wrapper should actually take (a trick
  239. used by Gtk2::Gdk::Event), or represent a boxed type as a native perl type
  240. (such as using array references for Gnome2::Canvas::Point objects).  All of
  241. this happens automagically, behind the scenes, and most types assume the
  242. default wrapper class.
  243.  
  244. See the commentary in gperl.h for more information.
  245.  
  246. =head2 GObject 
  247.  
  248. The GObject knows its own type.  Thus, we need only one parameter to create a
  249. GObject wrapper.  In reality, we ask for two:
  250.  
  251.  SV * gperl_new_object (GObject * object, gboolean own);
  252.  
  253. The wrapper SV will be blessed into the package corresponding to the gtype
  254. returned by G_OBJECT_TYPE (object), that is, the bottommost type in the
  255. inheritance chain.  If that bottommost type is not known, the function walks
  256. back up the tree until it finds one that's known, blesses the reference into
  257. that package, and spits out a warning on stderr.  To hush the warning, you need
  258. merely call
  259.  
  260. In general, this process will claim a reference on the GObject (with
  261. g_object_ref()), so that the C object stays alive so long as there is a perl
  262. wrapper for it.  If <i>own</i> is set to TRUE, the perl wrapper will claim
  263. ownership of the C object by removing that reference; in theory, for a new
  264. GObject, fresh from a constructor, this leaves the object with a single
  265. reference owned by the perl object.  The next question out of your mouth should
  266. be, "But what about GObject derivatives that require sinking or other strange
  267. methods to claim ownership?"  For the answer, see the GtkObject section's
  268. description of sink functions.
  269.  
  270.  void gperl_register_object (GType gtype, const char * package);
  271.  
  272. This magical function also sets up the @ISA for the package to point to the
  273. package corresponding to g_type_parent (gtype).  [Since this requires the
  274. parent package to be registered, there is a simple deferral mechanism, which
  275. means your @ISA might not be set until the next call to gperl_register_object.]
  276.  
  277.  
  278. There are two ways to get an object out of an SV (though I think only one is
  279. really needed):
  280.  
  281.  GObject * gperl_get_object (SV * sv);
  282.  GObject * gperl_get_object_check (SV * sv, GType gtype);
  283.  
  284. The second one is like the first, but croaks if the object is not derived from
  285. gtype.
  286.  
  287. You can get and set object data and object parameters just like you'd expect.
  288.  
  289. =head2 GSignal 
  290.  
  291. All of this GObject stuff wouldn't be very useful if you couldn't connect
  292. signals and closures.  I got most of my handling code from gtk2-perl and pygtk,
  293. and it's pretty straightforward.  The data member is optional, and must be a
  294. scalar.
  295.  
  296. To connect perl subroutines to GSignals I use GClosures, which require the
  297. handling of GValues.
  298.  
  299. =head2 GPerlClosure
  300.  
  301. Use a GPerlClosure wherever you could use a GClosure and things should work out
  302. great.  I<FIXME say more here>
  303.  
  304. =head2 GPerlCallback
  305.  
  306. Function pointers are required in many places throughout gtk+, usually for a
  307. callback to be used as a "foreach" function or for some other purpose.
  308. Unfortunately, a majority of these spots aren't designed to work with GClosures
  309. (usually by lacking a way to destroy data associated with the callback when it
  310. is no longer needed).  For this purpose, the GPerlCallback wraps up the
  311. gruntwork of using perl's call_sv to use a callback function directly.
  312.  
  313. =head1 SEE ALSO
  314.  
  315. perl(1), perlxs(1), perlguts(1), perlapi(1), perlxstut(1),
  316. L<ExtUtils::Depends>(3pm), L<ExtUtils::PkgConfig>(3pm)
  317. L<Glib>(3pm), L<Glib::Object::Subclass>(3pm), L<Glib::xsapi>(3pm)
  318.  
  319. =head1 AUTHOR
  320.  
  321. muppet E<lt>scott at asofyet.orgE<gt>
  322.  
  323. =head1 COPYRIGHT
  324.  
  325. Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the
  326. full list)
  327.  
  328. This library is free software; you can redistribute it and/or modify it under
  329. the terms of the GNU Library General Public License as published by the Free
  330. Software Foundation; either version 2.1 of the License, or (at your option) any
  331. later version.
  332.  
  333. This library is distributed in the hope that it will be useful, but WITHOUT ANY
  334. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  335. PARTICULAR PURPOSE.  See the GNU Library General Public License for more
  336. details.
  337.  
  338. You should have received a copy of the GNU Library General Public License along
  339. with this library; if not, write to the Free Software Foundation, Inc., 59
  340. Temple Place - Suite 330, Boston, MA  02111-1307  USA.
  341.  
  342. =cut
  343.